docker 网络指南
Docker自身有4种网络工作方式,和一些自定义网络模式
安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host
host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围
None:该模式关闭了容器的网络功能
Bridge:此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信
以上都是不用动手的,真正需要配置的是自定义网络
默认网络
使用docker network ls命令列出这些网络
docker network ls |
Docker内置这三个网络,运行容器时,你可以使用该—network标志来指定容器应连接到哪些网络
bridge网络代表docker0所有Docker安装中存在的网络。除非你使用该docker run —network=
我们在使用docker run创建Docker容器时,可以用 —net 选项指定容器的网络模式,Docker可以有以下4种网络模式:
host模式:使用 —net=host 指定
none模式:使用 —net=none 指定
bridge模式:使用 —net=bridge 指定,默认设置
container模式:使用 —net=container:NAME_or_ID 指定
Host
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址
容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
Container
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享
新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等
同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的
两个容器的进程可以通过lo网卡设备通信
None
实际上,该模式关闭了容器的网络功能
Bridge
相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡
通过docker0网桥以及Iptables nat表配置与宿主机通信
bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上
自定义网络
建议使用自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址
Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络
docker network create --driver bridge ltb_test_net |
创建网络后,可以看到新增加了一个网桥br-762457e516bc
可以通过docker network inspect查看网络配置信息
docker network inspect ltb |
容器要使用新的网络,需要在启动时通过 --network
指定
docker run -it --network=ltb_test_net 7c1fe /bin/bash |
同一网络中的容器、网关之间都是可以通信的
不同网络容器通信可以用docker network connect命令实现
docker network connect ltb_net 7c1fe |
从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过“容器名”通信。方法很简单,只要在启动时用 --name
为容器命名就可以了
docker run -it --network=my_net2 --name=bbox1 busybox |
然后,bbox2 就可以直接 ping 到 bbox1 了
使用 docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的
可以通过docker network rm 实现
docker network rm ltb_test_net |
再ifconfig时,网桥已经不见了